package com.neusoft.ch1;
/*
 * 课堂笔记：
 *    5、位运算符（后续）
 *       位移运算：将计算机中二进制的数的位数进行移动。
 *       << 不带符号左移  >> 不带符号右移  >>> 带符号右移
 *       <<:最高位符号位不动，其他位上的数向左移动N位，右侧空余部分补0；左侧移出的位做丢弃处理；
 *          左移N位表示乘以2的N次幂；
 *       >>:最高位符号位不动，其他位上的数向右移动N位，左侧空余部分补符号位；右侧移出的位做丢弃处理；
 *          右移N位表示除以2的N次幂；
 *       >>>:最高位符号位也参与移动，左侧空余部分补0；右侧移出的位做丢弃处理；（该运算符对负数没有意义）
 *       
 *       注意：
 *           位运算是在补码的基础之上进行的。（计算机中所有的数都是以补码的形式存在的）
 *           通过位移的乘法和除法执行效率要比* /效率高；
 *       使用位运算进行变量值的交换。★★★ (多用于整型数据交换)   
 *   6、问号表达式 ?:
 *      问号表达式是高级语言中唯一的一个三元运算符；（需要三个操作数）
 *      语法：
 *          条件判定表达式?结果表达式1:结果表达式2; 
 *      解析：
 *          如果条件判定表达式的结果为true，则取结果表达式1作为整个问号表达式的最终结果；
 *          反之，取结果表达式2作为整个问号表达式的最终结果；      
 *      注意：
 *          ?前面的条件判定表达式的运算结果只能是boolean类型；
 *          结果表达式1和结果表达式2还可以继续嵌套问号表达式；
 *          整个问号表达式的结果类型取决于结果表达式1和结果表达式2的类型；
 *          一般，结果表达式1和结果表达式2的类型是一样或者兼容（可以进行默认转换） 
 *          问号表达式等价于if-else语句；
 */

public class TestCh1 {

	public static void main(String[] args) {
		// 左移
		int iVal10 = -128;
		// 移动的位数
		int iCount = 1;
		// 左移iCount位
		int iVal101 = iVal10 << iCount;
		System.out.println(iVal10 + "左移" + iCount + "位：" + iVal101);
		// 右移iCount位
		int iVal102 = iVal10 >> iCount;
		System.out.println(iVal10 + "右移" + iCount + "位：" + iVal102);
		// 带符号右移iCount位
		int iVal103 = iVal10 >>> iCount;
		System.out.println(iVal10 + "右移" + iCount + "位：" + iVal103);
		
		System.out.println("==========交换两个变量的值===========");
		// 交换两个变量的值
		int iVal20 = 3;
		int iVal21 = 4;
		//要求交换两个变量的值
		// 定义一个临时变量
		int iTemp;
		// 交换处理
		iTemp = iVal20;
		iVal20 = iVal21;
		iVal21 = iTemp;
		System.out.println("iVal20="+iVal20);
		System.out.println("iVal21="+iVal21);
		
		System.out.println("=========位运算交换量变量的值============");
		// 使用位运算交换两个变量的值
		int iVal30 = 3;
		int iVal31 = 4;
		
		// 交换处理
		//iVal30=iVal30^iVal31;
		iVal30^=iVal31;
		iVal31^=iVal30;
		iVal30^=iVal31;
		System.out.println("iVal30="+iVal30);
		System.out.println("iVal31="+iVal31);
		
		System.out.println("=======================");
		// 问号表达式
		int iAge = 18;
		String strResult = iAge>=18?"成年人":"未成年人";
		System.out.println(strResult);
		
		// 课堂练习：根据成绩分数（百分制），换分成绩等级为优秀、良好、中等、及格、不及格；
		// 使用嵌套的问号表达式实现
		// 成绩变量
		int iScore = 85;
		String strGrade = iScore < 60 ? "不及格" : 
								iScore < 70 ? "及格" : 
									iScore < 80 ? "中等" : 
										iScore < 90 ? "良好" : "优秀";
		
		System.out.println("成绩" + iScore + "的等级为：" + strGrade);
		
		System.out.println("=========练习=============");
		// 练习
		int x = 1;
		int y = 2;
		//y+=y--/++x; // y--表达式2， 变量y=1；表达式++x是2，  变量x=2  
		/*
		 *  计算过程：
		 *  先设置一个临时变量保存y的值2；
		 *  然后计算=号右边的表达式的值为1；
		 *  再将右边表达式的值1和临时变量的值2进行 +=运算
		 *  最后将运算结果重新赋值给变量y
		 */		
		// 等价于
		int temp = y;
		int tempRight = y-- / ++x;
		y = temp + tempRight;
		//y=y+y--/++x;
		System.out.println("y="+y);
	}

}
